KM-57. 爬楼梯

KM-57. 爬楼梯

题目链接

代码随想录

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬至多 m (1 <= m < n) 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

输入描述:输入共一行,包含两个正整数,分别表示 n, m

输出描述:输出一个整数,表示爬到楼顶的方法数。

输入示例:3 2

输出示例:3

提示:

当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。

此时你有三种方法可以爬到楼顶。

分析

我们先分析题意

因此这道题实际上就是求完全背包求放满背包的排列数,跟 377. 组合总和 Ⅳ 一模一样。

holy shit,真的是个天才般的思路。

解题

public int combinationSum4(int m, int n) {
    int[] dp = new int[n+1];
    dp[0]=1;
    for(int j=0;j<target+1;j++){
        for(int i=0;i<m;i++){
	        // (i+1) 对应 step[i]
            if(j>=(i+1)]){
                dp[j]=dp[j]+dp[j-(i+1)];
            }
        }
    }
    return dp[n];
}

卡码网题解

import java.util.*;

public class Main{

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n =  sc.nextInt();
        int m = sc.nextInt();
	    int[] dp = new int[n+1];
        dp[0] = 1;
        for(int j=0;j<=n;j++){
            for(int i=0;i<m;i++){
                // 步数数组 step 的含义是 step[i] = i+1;
                if(j>=(i+1)){
                    dp[j] = dp[j] + dp[j-(i+1)];
                }
            }
        }
        System.out.println(dp[n]);
        // return dp[n];
    }

}

相关题

70. 爬楼梯

377. 组合总和 Ⅳ

518. 零钱兑换 II#先遍历被包容量再遍历物品 VS 先遍历物品再遍历被包容量